package org.vivi.framework.iexcelbatch.processor;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
import java.util.function.Function;

@Slf4j
@Service
public class BatchDataProcessor {


    /**
     * 批量插入
     * @param list  要分批处理的数据
     * @param dbFunction  数据库操作的方法
     * @param <T> 数据库实体类
     * @return 返回处理结果
     */
    @Async
    public <T> Future<int[]> saveAsyncBatch(List<T> list, Function<List<T>,Integer> dbFunction) {
        int size = list.size();
        int[] result = new int[2];
        log.info("saveAsyncBatch当前数据分片大小 size:{}",size);
        try {
            if (dbFunction.apply(list) > 0) {
                result[0] = size;
                log.info("{} 分片存储数据成功,数据量：{}",Thread.currentThread().getName(), size);
            } else {
                result[1] = size;
                log.info("{} 分片存储数据失败：{}",Thread.currentThread().getName(), size);
            }
        }catch (Exception e){
            result[1] = size;
            log.error("{} 分片存储数据出现异常，{}",Thread.currentThread().getName(),e.getMessage());
        }

        return new AsyncResult<int[]>(result);
    }

    /**
     * 批量插入
     * @param list  要分批处理的数据
     * @param dbFunction  数据库操作的方法
     * @param <T> 数据库实体类
     * @return 返回处理结果
     */
    @Async
    public <T> CompletableFuture<int[]> saveAsyncBatch2(List<T> list, Function<List<T>,Integer> dbFunction) {
        int size = list.size();
        int[] result = new int[2];
        log.info("saveAsyncBatch当前数据分片大小 size:{}",size);
        try {
            if (dbFunction.apply(list) > 0) {
                result[0] = size;
                log.info("{} 分片存储数据成功,数据量：{}",Thread.currentThread().getName(), size);
            } else {
                result[1] = size;
                log.info("{} 分片存储数据失败：{}",Thread.currentThread().getName(), size);
            }
        }catch (Exception e){
            result[1] = size;
            log.error("{} 分片存储数据出现异常，{}",Thread.currentThread().getName(),e.getMessage());
        }

        return CompletableFuture.completedFuture(result);
    }
}
